主幹開發的英文全名是 Trunk-Based Development,簡稱 TBD,直譯是「基於主幹的開發」。
「基於主幹」指的是,大家都把主幹當作開發的共同基底。無論是新增功能、修正問題,還是調整既有程式,都從主幹上的共同版本出發,並頻繁地把程式整合回主幹,同時維持可發布的狀態。
當年我在翻譯時,考量到中文的特性,省略「基於」兩個字也能表達相同意思,因此決定簡稱為「主幹開發」。
主幹(trunk)是團隊共同維護的主要分支。它可以叫 main、trunk,也可以使用其他名稱。團隊要將它當作開發的共同基底,持續在這裡整合程式。
在日常的開發工作裡,開發者需要頻繁取得主幹上的更新,同時也要持續將準備好的程式提交到主幹。這兩個方向的同步,需要在開發過程中反覆進行。
下圖示意兩位開發者透過主幹取得彼此的提交,時間由上往下。

開始開發前,開發者必須先查看主幹最新版本的驗證結果。確認驗證通過後,再取得更新並整合到自己的程式。若驗證失敗或尚未完成,就先了解目前的狀況,再決定如何繼續。
開發期間,其他人會持續提交新的變更到主幹,因此需要頻繁取得更新。將更新整合到自己的程式後,也要驗證程式是否仍符合預期。
除了取得主幹更新,開發者也要將準備好的程式及早提交到主幹。
提交到主幹前,開發者要先在本地完成必要驗證,並依團隊流程完成審查。程式如果仍留在自己的分支上,還不算完成與主幹的整合。
提交到主幹後,也要確認更新後的主幹是否通過必要驗證。確認通過後,其他人就能取得更新,並作為繼續開發的基礎。
當一個版本通過必要驗證、且具備交付條件,就可以依需要安排發布,這稱之為「可發布性」(releasability)。要維持這個狀態,需要把整合做完整:除了將程式合併在一起,也要確認既有功能、新加入的程式,以及它們運作的結果是否符合預期。
驗證要針對更新後的主幹進行,不能只看各自程式的測試結果。測試通過,表示受測情境中檢查的結果符合預期;未涵蓋的情境與行為,仍可能存在問題。
如果建置或必要檢查失敗,要通知團隊找出原因並修復,必要時還原有問題的變更。修正後重新驗證,並讓團隊知道結果;還在驗證時,也要清楚標示尚未完成。
Nathan 團隊已經有 main 作為主要分支,可以在這裡落實主幹開發的做法,讓大家頻繁取得更新,也把準備好的程式整合回來。
Kevin 與 Phoebe 的情況,對應到頻繁取得主幹更新。Phoebe 的提交已經進入 main,Kevin 卻到準備合併時才發現雙方的差異。Kevin 需要在開發過程中持續取得更新,確認共用模組有哪些需要配合調整的地方,與 Phoebe 討論並驗證整合後的行為。
下圖示意 Kevin 在開發途中取得更新後的協調過程。

Elvina 等待共用模組的情況,則對應到及早將程式提交到主幹。Kevin 與 Elvina 需要先確認所需模組可以分開驗證,再由 Kevin 整理好這部分的程式,完成必要審查與驗證後提交到主幹。確認主幹的驗證通過後,Elvina 就能從主幹取得模組,不必一起帶入 Kevin 其他尚未完成的程式。她仍需驗證模組與自己程式的組合,並與 Mandy 確認前後端的完整流程。
下圖以所需模組可以分開驗證為前提,示意整合順序。

Sharon 擔心原本的功能受到影響,則對應到整合是否完整。Kevin 與 Phoebe 處理完衝突後,仍要確認共用模組與原本、新增的功能是否能配合運作;Elvina 與 Mandy 也需要確認前後端的完整流程。這些驗證不能只看各自分支上的結果,而要針對實際整合後的版本進行,才能作為判斷是否符合發布條件的依據。
主幹開發需要團隊頻繁取得主幹更新,也持續把準備好的程式提交到主幹。提交前完成審查與必要驗證,提交後確認主幹的驗證結果。發現問題時及時處理,並在開發過程中做好發布準備,讓主幹保持可發布的狀態。